home *** CD-ROM | disk | FTP | other *** search
-
- ;HRTmon Amiga system monitor
- ;Copyright (C) 1991-1998 Alain Malek Alain.Malek@cryogen.com
- ;
- ;This program is free software; you can redistribute it and/or
- ;modify it under the terms of the GNU General Public License
- ;as published by the Free Software Foundation; either version 2
- ;of the License, or (at your option) any later version.
- ;
- ;This program is distributed in the hope that it will be useful,
- ;but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;GNU General Public License for more details.
- ;
- ;You can find the full GNU GPL online at: http://www.gnu.org
-
- ;-------------- Search copper-list -----------------------------
-
- cmd_cop moveq #0,d5
- move.l max_chip,d6
- bsr evaluate
- bmi.w illegal_addr
- bgt.w .norange
- move.l d0,d5
- and.w #$fffe,d5
- bsr evaluate
- bmi.w illegal_addr
- bgt.w .norange
- move.l d0,d6
- and.w #$fffe,d6
- .norange cmp.l d5,d6
- bls.w illegal_addr
-
- move.l d5,a0
- move.l d6,a1
- bsr search_cop
- tst.l d7
- beq.b .cop
-
- lea.l copfailed_txt(pc),a0
- bsr print
- bra.b .out
-
- .cop lea.l copfound_txt(pc),a0
- bsr print
- moveq #8,d1
- move.l custom+$80,d0
- bsr print_hexCR
-
- .out bra.w end_command
-
- copfailed_txt dc.b "Couldn't find copper-list",$a,0
- copfound_txt dc.b "Copper-list found at $",0
- even
-
-
- ;-> a0-a1 = search range
- ;<- d0 = copper address
- ;<- d7 = success / failed
-
- search_cop movem.l d1/a2-a3,-(a7)
- bsr remove_pic
- move.w #$8380,$dff096
- move.w #$2700,sr
-
- bsr find_cop_int
-
- moveq #-1,d7
-
- moveq #-2,d1
- .seek cmp.l a1,a0
- bge.w .end
- cmp.l (a0),d1
- beq.b .try
- addq.l #2,a0
- bra.b .seek
-
- .try move.l a0,a2
- addq.l #2,a0
-
- move.l a2,a3
- subq.l #4,a2
- bsr .test_cop
- beq.b .seek
-
- .up lea.l -$200(a2),a2
- cmp.l #0,a2
- bge.b .okmin
- suba.l a2,a2
- bra.b .down
- .okmin bsr .test_cop
- bne.b .up
-
- .down lea.l $20(a2),a2
- cmp.l a3,a2
- ble.b .okmax
- move.l a3,a2
- bra.b .up2
- .okmax bsr .test_cop
- beq.b .down
-
- .up2 subq.l #4,a2
- bsr .test_cop
- bne.b .up2
-
- addq.l #4,a2
-
- moveq #0,d7
- move.l a2,d0
- move.l d0,custom+$80
-
- .end move.l d0,-(a7)
- moveq #0,d0
- jsr analyse_copper
- move.l (a7)+,d0
-
- bsr set_pic
- move.w #$80,$dff096
- move.w #$7fff,$dff09c
- move.w #$2000,sr
- movem.l (a7)+,d1/a2-a3
- rts
-
- .test_cop movem.l d0/d6,-(a7)
-
- move.w (a2),d0
- btst #0,d0
- beq.b .move
- cmp.b #$f0,d0
- bhi.b .nocop
- bra.b .okwait
- .move tst.w d0
- beq.b .nocop
- cmp.w #$1fe,d0
- bls.b .okwait
- .nocop moveq #0,d0
- bra.b .exittest
-
- .okwait move.w cop_int(pc),$dff09c
- move.l (a2),d6
- move.l #$009c8000,d0
- or.w cop_int(pc),d0
- move.l d0,(a2)
- ; move.w #$0,$dff088
- move.b #0,$bfe801
- .wait cmp.b #2,$bfe801
- bls.b .wait
- move.w $dff01e,d0
- move.l d6,(a2)
- and.w cop_int(pc),d0
- .exittest movem.l (a7)+,d0/d6
- rts
-
- cop_int dc.w 0
-
- ;-------------- find a 'free' interrupt for copper searching -----
-
- find_cop_int movem.l d0-d1/a0,-(a7)
- move.w #$10,d1 ;copint
- bsr.b .test
- beq.b .ok_int
-
- move.w #4,d1 ;softint
- bsr.b .test
- beq.b .ok_int
-
- lea.l .warning_txt(pc),a0
- bsr print
-
- .ok_int move.w d1,cop_int
- movem.l (a7)+,d0-d1/a0
- rts
-
- .test move.w d1,$dff09c
- ; move.w #$0,$dff088
- move.b #0,$bfe801
- .wait cmp.b #2,$bfe801
- bls.b .wait
- move.w $dff01e,d0
- and.w d1,d0
- rts
-
- .warning_txt dc.b "Couldn't find a free interrupt !",$a,0
- even
-
- ;----------------------------------------------------------
- ;-------------- analyse the actual copper-list and --------
- ;-------------- update custom registers -------------------
-
- ;-> d0=pic_no (stop the scan after the d0th write to $DFF100, 0=scan all)
-
- analyse_copper movem.l d0-a4,-(a7)
- move.w d0,d6
- bne.b .okpara
- moveq #-1,d6
- .okpara lea.l custom,a3
- move.l $80(a3),d0 ;get copper 1 start
- bsr.b .analyse
- movem.l (a7)+,d0-a4
- rts
-
-
- ;-> d0=ptr on copper-list
-
- .analyse lea.l custom,a3
- lea.l paletteH-$180,a1
- move.w ($106,a3),d3
- btst #9,d3 ;low or high bits palette
- beq.b .high
- lea.l paletteL-$180,a1
- .high rol.w #3,d3
- and.w #%111,d3 ;d1=bank no.
- lsl.w #6,d3 ;*32*2
- add.w d3,a1
-
- lea.l move_list,a2
- btst #0,d0
- bne.w .end ;copper list at odd address ?
- move.l d0,a0
-
- .loop move.l a0,a4
- bsr reloc_pic
- movem.w (a4)+,d0/d1 ;read actual instr.
- addq.l #4,a0 ;go next instr.
- btst #0,d0 ;wait/skip or move instr. ?
- bne.b .waitinst
-
- cmp.w #$200,d0 ;legal custom register ?
- bcc.w .end
-
- cmp.w #$88,d0 ;cop1jmp ?
- bne.b .nojmp1
- move.l ($80,a3),a0 ;do the jmp to cop1
- bra.b .loop
- .nojmp1 cmp.w #$8a,d0 ;cop2jmp ?
- bne.b .nojmp2
- move.l ($84,a3),a0 ;do the jmp to cop2
- bra.b .loop
-
- .nojmp2 cmp.w #$180,d0
- blt.b .nocolor
- cmp.w #$1be,d0
- bgt.b .nocolor
- move.w d1,(a1,d0.w) ;copy in actual palette bank
-
- .nocolor cmp.w #$106,d0
- bne.b .nobplcon3
-
- lea.l paletteH-$180,a1
- move.w d1,d3
- btst #9,d3 ;low or high bits palette
- beq.b .high2
- lea.l paletteL-$180,a1
- .high2 rol.w #3,d3
- and.w #%111,d3 ;d1=bank no.
- lsl.w #6,d3 ;*32*2
- add.w d3,a1
-
- .nobplcon3 move.w d0,d2
- lsr.w #1,d2
- tst.b (a2,d2.w) ;do I need to copy this value ?
- beq.b .nocopy
- move.w d1,(a3,d0.w) ;copy in custom
- cmp.w #$100,d0
- bne.b .no100
- subq.w #1,d6 ;dec(pic_no)
- beq.b .end
- .no100 bra.b .nocopy
-
- .waitinst cmp.w #$ffff,d0
- beq.b .end
-
- .nocopy bra.w .loop
-
- .end rts
-
- cnop 0,4
- ;-------------- flags signaling registers to copy ---------
- ;-------------- from copper-list to custom ----------------
-
- move_list dcb.b $40,0 ;$000-$07e
- dc.b -1,-1 ;$80,$82 ;cop1
- dc.b -1,-1 ;$84,$86 ;cop2
- dc.b 0,0,0 ;$88,$8a,$8c
- dc.b -1,-1,-1,-1 ;$8e,$90,$92,$94
- dcb.b $25,0 ;$96-$de
- dcb.b $10,-1 ;$e0-$fe
- dcb.b 7,-1 ;$100-$10c
- dcb.b 9,0 ;$10e-$11e
- dcb.b $10,-1 ;$120-$13e
- dcb.b $20,0 ;$140-$17e
- dcb.b $20,-1 ;$180-$1be
- dcb.b $d,0 ;$1c0-$1d8
- dc.b 0 ;$1da
- dc.b -1 ;$1dc
- dc.b -1,-1,-1 ;$1de-$1e2
- dc.b -1 ;$1e4
- dcb.b $b,0 ;$1e6-$1fa
- dc.b -1 ;$1fc
- dc.b 0 ;$1fe
- move_end
-
-